www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/sova.m

    function L_all = sova(rec_s, g, L_a, ind_dec) 
% 函数实现的主要功能:对解调信号进行SOVA译码,计算LLR
% 输入变量: 
%     DataInfor: 接受比特的加权. 
%     DataInfor = 0.5 * L_c * yk = ( 2 * a * rate * Eb/N0 ) * yk
%     g: 生成矩阵.
%     prInfor: 另一个分量译码器的先验信息
%     DecorderIndex: 分量译码器的索引号 
% 输出变量: 
%     LogRatio: 概率对数似然比值LogRatio=log ( P(x=1|y) ) / ( P(x=-1|y) ).
% 
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-07-11
%  ==========================================================

% 比特总数: 信息 + 尾比特 
L_total = length(L_a);
[n,K] = size(g); 
m = K - 1;
nstates = 2^m;
Infty = 1e10;

%SOVA窗口大小
delta = 30;    

% 生成trellis
[next_out, next_state, last_out, last_state] = trellis(g);

% 初始化状态度量矩阵
path_metric = zeros(nstates,L_total+1);
for t=1:L_total+1
   for state=1:nstates
      path_metric(state,t) = -Infty;
   end
end

% 计算前向度量 状态度量矩阵
path_metric(1,1) = 0;
for t=1:L_total
   y = rec_s(2*t-1:2*t);
   for state=1:nstates
      sym0 = last_out(state,1:2);
      sym1 = last_out(state,3:4);
      state0 = last_state(state,1);
      state1 = last_state(state,2);
      Mk0 = y*sym0' - L_a(t)/2 + path_metric(state0,t);
      Mk1 = y*sym1' + L_a(t)/2 + path_metric(state1,t);
      
      if Mk0>Mk1
         path_metric(state,t+1)=Mk0;
         Mdiff(state,t+1) = Mk0 - Mk1;
         prev_bit(state, t+1) = 0;
      else
         path_metric(state,t+1)=Mk1;
         Mdiff(state,t+1) = Mk1 - Mk0;
         prev_bit(state,t+1) = 1;
      end

   end
end
      
%对于译码器1,后向路径从零状态开始;对于译码器2,后向路径从最相近状态开始
if ind_dec == 1
   mlstate(L_total+1) = 1;
else
   mlstate(L_total+1) = find( path_metric(:,L_total+1)==max(path_metric(:,L_total+1)) );
end

%后向度量得到比特输入,以及最可能的路径
for t=L_total:-1:1
   est(t) = prev_bit(mlstate(t+1),t+1);
   mlstate(t) = last_state(mlstate(t+1), est(t)+1);
end

%找出最小的delta
for t=1:L_total
   llr = Infty;
   for i=0:delta
      if t+i<L_total+1
         bit = 1-est(t+i);
         temp_state = last_state(mlstate(t+i+1), bit+1);
         for j=i-1:-1:0
            bit = prev_bit(temp_state,t+j+1);
            temp_state = last_state(temp_state, bit+1);
         end
         if bit~=est(t) 
            llr = min( llr,Mdiff(mlstate(t+i+1), t+i+1) );
         end
      end
   end
   L_all(t) = (2*est(t) - 1) * llr;
end